package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISocDispatchDAO;
import org.jsola.hr.dto.SocDispatchAddDTO;
import org.jsola.hr.dto.SocDispatchUpdateDTO;
import org.jsola.hr.entity.SocDispatchDO;
import org.jsola.hr.query.SocDispatchQuery;
import org.jsola.hr.vo.*;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 社保派单记录表
 *
 * @author zhr
 */
public interface ISocDispatchService extends IService<ISocDispatchDAO, SocDispatchDO> {

    /**
     * 新增社保派单记录表
     *
     * @param socDispatchAddDTO 新增社保派单记录表DTO
     * @param tokenUser         当前用户
     * @return 社保派单记录表详情信息
     */
    SocDispatchVO save(SocDispatchAddDTO socDispatchAddDTO, TokenUser tokenUser);

    /**
     * 修改社保派单记录表
     *
     * @param socDispatchUpdateDTO 修改社保派单记录表DTO
     * @param tokenUser            当前用户
     * @return 更新数量
     */
    int update(SocDispatchUpdateDTO socDispatchUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除社保派单记录表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser      当前用户
     * @param socDispatchIds 社保派单记录表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... socDispatchIds);

    /**
     * 根据社保派单记录表id查找
     *
     * @param socDispatchId 社保派单记录表id
     * @param siteId        所属站点id
     * @return 社保派单记录表详情信息
     */
    SocDispatchVO selectById(String socDispatchId, String siteId);

    /**
     * 查询社保派单记录表
     *
     * @param socDispatchQuery 查询条件
     * @param siteId           所属站点id
     * @return 社保派单记录表列表信息
     */
    List<SocDispatchListVO> select(SocDispatchQuery socDispatchQuery, String siteId);

    /**
     * 查询社保派单记录表记录数
     *
     * @param socDispatchQuery 查询条件
     * @param siteId           所属站点id
     * @return 社保派单记录表记录数
     */
    int selectCount(SocDispatchQuery socDispatchQuery, String siteId);

    /**
     * 分页查询社保派单记录表
     *
     * @param socDispatchQuery 查询条件
     * @param siteId           所属站点id
     * @return 社保派单记录表列表信息
     */
    Page<SocDispatchListVO> selectPage(SocDispatchQuery socDispatchQuery, String siteId);


    /**
     * 根据社保派单记录表id查找
     *
     * @param socDispatchId 社保派单记录表id
     * @param siteId        所属站点id
     * @return 社保派单记录表
     */
    SocDispatchDO selectDOById(String socDispatchId, String siteId);

    /**
     * 查询社保派单记录表
     *
     * @param socDispatchQuery 查询条件
     * @param siteId           所属站点id
     * @return 社保派单记录表列表
     */
    List<SocDispatchDO> selectDO(SocDispatchQuery socDispatchQuery, String siteId);

    /**
     * 查询某月社保派单记录表
     *
     * @param year   查询条件-年
     * @param month  查询条件-月
     * @param siteId 所属站点id
     * @return 社保派单记录表列表
     */
    List<SocDispatchDO> listByYearAndMonth(String companyId, String year, String month, String siteId);

    /**
     * 获取上月派单信息
     *
     * @param companyId 用工单位
     * @param year      年份
     * @param month     月份
     * @param tokenUser 当前用户
     * @return 上月派单信息
     */
    SocDispatchLastMonthVO getLastMonthInfo(String companyId, String year, String month, TokenUser tokenUser);

    /**
     * 根据社保派单记录表id查找派单记录统计情况
     *
     * @param socDispatchId 社保派单记录表id
     * @param siteId        所属站点id
     * @return 社保派单记录表详情信息
     */
    SocDetailsDispatchVO findDetailsById(String socDispatchId, String siteId);

    /**
     * 社保派单,分配到各个用工单位处理
     *
     * @param socDispatchId 社保派单记录表id
     * @param tokenUser     当前用户
     * @return 派单成功人数
     */
    Integer dispatchSend(String socDispatchId, TokenUser tokenUser);


    /**
     * 新增或修改派单记录
     *
     * @param companyId     公司Id
     * @param socDispatchId 派单记录id
     * @param isUpdate      新增还是修改,true:新增,false:修改
     * @param addOrLess     增员还是减员,true:增员,false:减员
     * @param year          年
     * @param month         月
     * @param tokenUser     当前用户
     * @return 派单记录
     */
    SocDispatchVO addOrUpdateSocDispatch(String companyId, String socDispatchId, boolean isUpdate, boolean addOrLess,
                                         String year, String month, TokenUser tokenUser);


    /**
     * 校验某公司年月能否派单
     *
     * @param companyId 公司id
     * @param year      年
     * @param month     月
     * @param siteId    站点id
     */
    void checkYearAndMonth(String companyId, String year, String month, String siteId);

    /**
     * 获取当前公司某参保方案可选择的分公司
     *
     * @param socId     参保方案id
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 公司某参保方案可选择的分公司
     */
    List<ChildCompanyListVO> listChildCompanyBySoc(String socId, String companyId, String siteId);
}


